#!/usr/bin/python
import ldap
import commands
import socket
import getopt
import ConfigParser
import sys
debug=0

salida={'Ldap': {\
                        'ldap_conn': 'ldap://',\
                        'ldap_user': '',\
                        'ldap_passwd': '',\
                        'ldap_base': 'ou=LTSP,o=MCR',\
                        'ldap_servers': ['sf-151.pm.rosario.gov.ar','sf-151.pm.rosario.gov.ar']\
        },'Ssl': {\
                        'cacert':''\
        },'Atributos': {\
                        'invisibles':['objectClass','cn','macAddress','ipHostNumber','rootpath','filename','PXEfilename']\
        },'Salida': {\
                        'arch_salida': '/dev/lts.conf'\
        }}

arch_conf="/etc/lgetltscfg/lgetltscfg.conf"


################################################################################################################
#					Funciones
###############################################################################################################
def configura():
        global arch_conf
        global salida
        config=ConfigParser.ConfigParser()
        config.read(arch_conf)
        for i in  config.sections():
                for v in config.options(i):
                        if salida.has_key(i) :
				if ((v == "ldap_servers") or (v == "invisibles")):
                        		salida[i][v]=str(config.get(i,v)).split(',')
				else:
					salida[i][v]=config.get(i,v)
                        else:
                            salida[i]={v : config.get(i,v)}

def saca_ip():
	comando_shell='ifconfig eth0 | grep "inet addr"'
	salidash=commands.getstatusoutput(comando_shell)
	if (salidash[0] == 0):
		ineta=str(salidash[1]).split('inet')
		#print ineta
		inet=str(ineta[1]).split(' ')
		#print inet
		ipt=str(inet[1]).split(':')
		#print ipt
		ip=ipt[1]
		return ip
	else:
		return 0
			
def arma_base(bases,nindex):
	salida1=""
	longi=len(bases)
	salida1=",".join(bases[(longi-nindex):longi])
	return salida1

def muestra_res(res):
	for i in range(len(res)):
		print "\n---------------------------------------------------------------\nRama Ldap :",res[i][0] ,"\n---------------------------------------------------------------\n"
		for u in res[i][1].keys() :
			print  u ," = ",res[i][1][u]

def muestra_final(res):
	global salida
	atr_invisibles=salida['Atributos']['invisibles']
	salida1=""
	print "\nConfiguracion del Puesto :", mi_ip
	print "************************\n"
	for u in res.keys() :
		if (not (u in atr_invisibles)) :
			sale=" ".join(res[u])
			#print  (str(u)).replace('-','_')+"---------------"
			print  (str(u)).replace('-','_')+"=\""+sale+"\""
			salida1 +=((str(u)).replace('-','_')).strip()+"=\""+sale+"\"\n"
	return salida1

def funde_opt(dicc1,dicc2):
	if len(dicc1)>0 or len(dicc2)>0 :
		dicc_def=dicc1
		for k in dicc2.keys() :
			dicc_def[k]=dicc2[k]
	else:
		dicc_def={}
		
	return dicc_def

################################################################################################################
#					Main
###############################################################################################################
mi_ip=saca_ip()
try:
	opts, args = getopt.getopt(sys.argv[1:], "c:d:vh",["config=","debug","version","help"])
except getopt.GetoptError, (msg, opt):
	print sys.argv[0] + ": " + msg
	print "Proba '" + sys.argv[0] + " --help' para mas info."
	sys.exit(3)
for option,value in opts:
	if option in ("-c","--config"):
		arch_conf = value
	elif option in ("-d","--debug"):
		debug=1
	elif option in ("-v","--version"):
		print "Configurador LTSP con soporte LDAP - de KUMITS SRL  \nVersion 0 Revision 1\n"
		sys.exit(3)

	elif option in ("-h","--help"):
		print "Usar: " + sys.argv[0] + " [OPCION]"
		print "Configurador LTSP con soporte LDAP - de KUMITS SRL \n by Seba Ferraro Tic .. Tic .. \nVersion 0 Revision 1\n"
		print "-c, --config=ruta_archivo   Ruta completa al archivo de configuracion."
		print "-d, --debug                 Mantiene la consola."
		print "-v, --version               Muestra la version."
		print "-h, --help                  Imprime la ayuda."
		sys.exit(3)
try:
        fh = open(arch_conf,"r")
        fh.close()
	configura()
	#print salida
except  Exception, err :
        print "\n\nImposible abrir archivo de configuracion.\nError:", arch_conf, "Error :",err
        print "\n\n\nEjecute de nuevo el programa para crear una configuracion por defecto", arch_conf
        print "\n\n\n"
        sys.exit(2)



for srv_ldap in salida['Ldap']['ldap_servers'] :
	if (salida['Ssl']['cacert'] != ""):
		ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,salida['Ssl']['cacert'])
	else:
		ldap_conn="ldap://"
        try:
		sal=""
		try :
			c=ldap.initialize(salida['Ldap']['ldap_conn']+srv_ldap )
			c.simple_bind_s(salida['Ldap']['ldap_user'],salida['Ldap']['ldap_passwd'])
		except Exception ,detail:
			print "Error al conectar con ", srv_ldap, " Detalle :",detail 

		res_puesto=c.search_s(salida['Ldap']['ldap_base'],ldap.SCOPE_SUBTREE,"iphostnumber="+mi_ip)
		if debug==1 :
			muestra_res(res_puesto)
		if len(res_puesto) > 0 :
			base_parse=res_puesto[0][0].split(',')
			print "Equipo Habilitado"
		else:
			arr_ip=mi_ip.split('.')
			ip_red=".".join(arr_ip[0:len(arr_ip)-1])+".0"
			print "Equipo No Habilitado - Pertenece a la Red :0",ip_red
			res_puesto=c.search_s(salida['Ldap']['ldap_base'],ldap.SCOPE_SUBTREE,"ipnetworknumber="+ip_red)
			if len(res_puesto)>0:
				base_parse=res_puesto[0][0].split(',')
				print "Red Habilitada :",base_parse
				
		indexa=len(salida['Ldap']['ldap_base'].split(','))
		tht={}
		while (indexa <= len(base_parse)):
			base_temp=arma_base(base_parse,indexa)
			res=c.search_s(base_temp,ldap.SCOPE_ONELEVEL,"cn=Default")
			if len(res) > 0 :
				if debug==1 :
					muestra_res(res)
				tht=funde_opt(tht,res[0][1])
			indexa += 1
		print "           ------------------------------------------------------------------"
		print "                          Servidor Ldap: ",srv_ldap           
		print "           ------------------------------------------------------------------"
		if len(res_puesto) > 0 :
			tht=funde_opt(tht,res_puesto[0][1])
		sal=muestra_final(tht)
		fh = open(salida['Salida']['arch_salida'],"w")
		nhost=str(socket.gethostname())
		fh.write("["+nhost+"]\n")
		fh.write(sal)
		fh.close()	
		break
			
	except Exception ,detail:
		print "Error --- Detalle :",detail 

